Prepare data
Prevalence
df_ger_prev <- read_csv('Germany_timeseries_prep.csv')
Parsed with column specification:
cols(
date = [31mcol_character()[39m,
anzahlfall = [32mcol_double()[39m,
kreis = [32mcol_double()[39m,
ewz = [32mcol_double()[39m,
shape__area = [32mcol_double()[39m,
cumcase = [32mcol_double()[39m,
kreis_name = [31mcol_character()[39m,
extra = [32mcol_double()[39m,
agree = [32mcol_double()[39m,
sci = [32mcol_double()[39m,
neuro = [32mcol_double()[39m,
open = [32mcol_double()[39m,
rate_day = [32mcol_double()[39m,
popdens = [32mcol_double()[39m,
runday = [32mcol_double()[39m
)
df_ger_prev <- df_ger_prev %>% mutate(date = as.Date(date, "%d%b%Y"),
kreis = as.character(kreis)) %>%
dplyr::select(kreis, date, rate_day)
df_ger_prev
Scoial distancing
df_ger_socdist <- read_csv('Germany_socdist_fb_kreis.csv')
Parsed with column specification:
cols(
all_day_ratio_single_tile_users = [32mcol_double()[39m,
date = [34mcol_date(format = "")[39m,
kreis = [32mcol_double()[39m,
kreis_name = [31mcol_character()[39m,
extra = [32mcol_double()[39m,
agree = [32mcol_double()[39m,
sci = [32mcol_double()[39m,
neuro = [32mcol_double()[39m,
open = [32mcol_double()[39m,
frequ = [32mcol_double()[39m,
runday = [32mcol_double()[39m
)
df_ger_socdist <- df_ger_socdist %>%
rename(socdist_single_tile = all_day_ratio_single_tile_users) %>%
select(kreis, date, socdist_single_tile) %>%
mutate(kreis = as.character(kreis))
df_ger_socdist
NA
Personality
df_ger_pers <- read_csv('Germany_timeseries_prep.csv')
Parsed with column specification:
cols(
date = [31mcol_character()[39m,
anzahlfall = [32mcol_double()[39m,
kreis = [32mcol_double()[39m,
ewz = [32mcol_double()[39m,
shape__area = [32mcol_double()[39m,
cumcase = [32mcol_double()[39m,
kreis_name = [31mcol_character()[39m,
extra = [32mcol_double()[39m,
agree = [32mcol_double()[39m,
sci = [32mcol_double()[39m,
neuro = [32mcol_double()[39m,
open = [32mcol_double()[39m,
rate_day = [32mcol_double()[39m,
popdens = [32mcol_double()[39m,
runday = [32mcol_double()[39m
)
df_ger_pers <- df_ger_pers %>%
select(kreis, open, sci, extra, agree, neuro) %>%
dplyr::rename(pers_o = open,
pers_c = sci,
pers_e = extra,
pers_a = agree,
pers_n = neuro) %>%
distinct() %>%
mutate(kreis = as.character(kreis))
df_ger_pers
NA
Controls
df_ger_ctrl <- read.csv2('Germany_controls.csv', sep = ';', dec=',')
df_ger_ctrl <- df_ger_ctrl %>% select(-kreis_nme) %>%
mutate(kreis = as.character(kreis),
popdens = popdens %>%
as.character() %>%
str_replace('\\.', '')%>%
as.numeric())
df_ger_ctrl
NA
Merge prevalence data
# create sequence of dates
date_sequence <- seq.Date(min(df_ger_prev$date),
max(df_ger_prev$date), 1)
# create data frame with time sequence
df_dates = tibble(date_sequence, 1:length(date_sequence))
names(df_dates) <- c('date', 'time')
# merge prevalence data
df_ger_prev <- df_ger_prev %>%
inner_join(df_ger_pers, by = 'kreis') %>%
inner_join(df_ger_ctrl, by = 'kreis') %>%
merge(df_dates, by='date') %>%
arrange(kreis)
df_ger_prev
Merge socdist data
# create sequence of dates
date_sequence <- seq.Date(min(df_ger_socdist$date),
max(df_ger_socdist$date), 1)
# create data frame with time sequence
df_dates = tibble(date_sequence, 1:length(date_sequence))
names(df_dates) <- c('date', 'time')
# merge socdist data
df_ger_socdist <- df_ger_socdist %>%
inner_join(df_ger_pers, by = 'kreis') %>%
inner_join(df_ger_ctrl, by = 'kreis') %>%
merge(df_dates, by='date') %>%
arrange(kreis)
df_ger_socdist
NA
Control for weekend effect
easter <- seq.Date(as.Date('2020-04-10'), as.Date('2020-04-13'), 1)
df_ger_loess <- df_ger_socdist %>%
mutate(weekday = format(date, '%u')) %>%
filter(!(weekday %in% c('6','7') | date %in% easter)) %>%
split(.$kreis) %>%
map(~ loess(socdist_single_tile ~ time, data = .)) %>%
map(predict, 1:max(df_ger_socdist$time)) %>%
bind_rows() %>%
gather(key = 'kreis', value = 'loess') %>%
group_by(kreis) %>%
mutate(time = row_number())
df_ger_socdist <- df_ger_socdist %>% merge(df_ger_loess, by=c('kreis', 'time')) %>%
mutate(weekday = format(date, '%u')) %>%
mutate(socdist_single_tile_clean = ifelse(weekday %in% c('6','7') | date %in% easter,
loess, socdist_single_tile)) %>%
arrange(kreis, time) %>%
select(-weekday)
df_ger_socdist %>% drop_na()
NA
Explore data
Plot prevalence over time
df_ger_prev %>% ggplot(aes(x=time, y=rate_day)) +
geom_point(aes(col=kreis, size=popdens)) +
geom_smooth(method="loess", se=T) +
theme(legend.position="none") +
ggtitle("Overall prevalence over time")

pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')
for (i in pers){
gg <- df_ger_prev %>% mutate(prev_tail = cut(.[[i]],
breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
labels = c('lower tail', 'center', 'upper tail'))) %>%
filter(prev_tail != 'center') %>%
ggplot(aes(x=time, y=rate_day)) +
geom_point(aes(col=kreis, size=popdens)) +
geom_smooth(method="loess", se=T) +
facet_wrap(~prev_tail) +
theme(legend.position="none") +
ggtitle(i)
print(gg)
}





Plot social distancing (single tile) over time
df_ger_socdist %>% ggplot(aes(x=time, y=socdist_single_tile_clean)) +
geom_point(aes(col=kreis, size=popdens)) +
geom_smooth(method="loess", se=T) +
theme(legend.position="none") +
ggtitle("Overall social distancing (single tile) over time")

pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')
for (i in pers){
gg <- df_ger_socdist %>% mutate(prev_tail = cut(.[[i]],
breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
labels = c('lower tail', 'center', 'upper tail'))) %>%
filter(prev_tail != 'center') %>%
ggplot(aes(x=time, y=socdist_single_tile_clean)) +
geom_point(aes(col=kreis, size=popdens)) +
geom_smooth(method="loess", se=T) +
facet_wrap(~prev_tail) +
theme(legend.position="none") +
ggtitle(i)
print(gg)
}





df_ger_socdist <- df_ger_socdist %>% mutate(socdist_single_tile = socdist_single_tile_clean) %>%
select(-loess, -socdist_single_tile_clean)
Correlations
df_ger_prev %>% group_by(kreis) %>%
summarize_if(is.numeric, mean) %>%
select(-kreis, -time) %>%
cor(use='pairwise.complete') %>%
round(3) %>% as.data.frame()
df_ger_socdist %>% group_by(kreis) %>%
summarize_if(is.numeric, mean) %>%
select(-kreis, -time) %>%
cor(use='pairwise.complete') %>%
round(3) %>% as.data.frame()
NA
NA
Rescale data
lvl2_scaled <- df_ger_prev %>%
dplyr::select(-time, -rate_day, -date) %>%
distinct() %>%
mutate_at(vars(-kreis), scale)
lvl1_scaled <- df_ger_prev %>% select(kreis, time, rate_day)
df_ger_prev_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'kreis')
df_ger_prev_scaled
NA
lvl2_scaled <- df_ger_socdist %>%
dplyr::select(-time, -socdist_single_tile, -date) %>%
distinct() %>%
mutate_at(vars(-kreis), scale)
lvl1_scaled <- df_ger_socdist %>% select(kreis, time, socdist_single_tile)
df_ger_socdist_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'kreis')
df_ger_socdist_scaled
NA
Predict Prevalence
Explore distributions
df_ger_onset_prev %>% ggplot(aes(onset_prev)) + geom_histogram()

df_ger_slope_prev %>% ggplot(aes(slope_prev)) + geom_histogram()

Predict COVID onset with time-to-event regression
# predict onset from personality
cox_onset_prev <- coxph(Surv(onset_prev, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_ger_onset_prev)
cox_onset_prev %>% summary()
Call:
coxph(formula = Surv(onset_prev, event) ~ pers_o + pers_c + pers_e +
pers_a + pers_n, data = df_ger_onset_prev)
n= 400, number of events= 400
coef exp(coef) se(coef) z Pr(>|z|)
pers_o 0.131653 1.140712 0.051953 2.534 0.0113 *
pers_c -0.104500 0.900775 0.053314 -1.960 0.0500 *
pers_e 0.056186 1.057794 0.052903 1.062 0.2882
pers_a -0.008624 0.991413 0.049615 -0.174 0.8620
pers_n -0.276799 0.758207 0.057728 -4.795 1.63e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 1.1407 0.8766 1.0303 1.263
pers_c 0.9008 1.1102 0.8114 1.000
pers_e 1.0578 0.9454 0.9536 1.173
pers_a 0.9914 1.0087 0.8995 1.093
pers_n 0.7582 1.3189 0.6771 0.849
Concordance= 0.592 (se = 0.018 )
Likelihood ratio test= 39.92 on 5 df, p=2e-07
Wald test = 37.99 on 5 df, p=4e-07
Score (logrank) test = 37.99 on 5 df, p=4e-07
# predict onset from personality with controls
cox_onset_prev_ctrl <- coxph(Surv(onset_prev, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n +
women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age +
popdens,
data = df_ger_onset_prev)
cox_onset_prev_ctrl %>% summary()
Call:
coxph(formula = Surv(onset_prev, event) ~ pers_o + pers_c + pers_e +
pers_a + pers_n + women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age + popdens,
data = df_ger_onset_prev)
n= 392, number of events= 392
(8 observations deleted due to missingness)
coef exp(coef) se(coef) z Pr(>|z|)
pers_o 0.060631 1.062506 0.059458 1.020 0.307861
pers_c -0.082813 0.920523 0.060718 -1.364 0.172598
pers_e 0.009496 1.009541 0.059390 0.160 0.872972
pers_a -0.019747 0.980447 0.057978 -0.341 0.733413
pers_n -0.249887 0.778889 0.064236 -3.890 0.000100 ***
women 0.083662 1.087261 0.068554 1.220 0.222322
academics 0.335157 1.398160 0.100092 3.348 0.000813 ***
cdu 0.179656 1.196805 0.079129 2.270 0.023182 *
afd -0.017508 0.982644 0.079368 -0.221 0.825408
hospital_beds -0.233707 0.791594 0.068731 -3.400 0.000673 ***
tourism_beds 0.055041 1.056584 0.055716 0.988 0.323208
gdp -0.151600 0.859332 0.115313 -1.315 0.188618
manufact 0.112626 1.119214 0.095688 1.177 0.239190
airport -0.179572 0.835627 0.062056 -2.894 0.003807 **
age -0.102691 0.902406 0.090956 -1.129 0.258890
popdens 0.125177 1.133349 0.087247 1.435 0.151360
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 1.0625 0.9412 0.9456 1.1938
pers_c 0.9205 1.0863 0.8172 1.0369
pers_e 1.0095 0.9905 0.8986 1.1342
pers_a 0.9804 1.0199 0.8751 1.0984
pers_n 0.7789 1.2839 0.6867 0.8834
women 1.0873 0.9197 0.9506 1.2436
academics 1.3982 0.7152 1.1491 1.7012
cdu 1.1968 0.8356 1.0249 1.3976
afd 0.9826 1.0177 0.8411 1.1480
hospital_beds 0.7916 1.2633 0.6918 0.9057
tourism_beds 1.0566 0.9464 0.9473 1.1785
gdp 0.8593 1.1637 0.6855 1.0772
manufact 1.1192 0.8935 0.9278 1.3501
airport 0.8356 1.1967 0.7399 0.9437
age 0.9024 1.1081 0.7551 1.0785
popdens 1.1333 0.8823 0.9552 1.3447
Concordance= 0.659 (se = 0.016 )
Likelihood ratio test= 106.5 on 16 df, p=2e-15
Wald test = 104.3 on 16 df, p=5e-15
Score (logrank) test = 108.4 on 16 df, p=9e-16
Predict prevalence slopes with linear models
# predict slopes from personality
lm_slope_prev <- lm(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_ger_slope_prev)
lm_slope_prev %>% summary()
Call:
lm(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a +
pers_n, data = df_ger_slope_prev)
Residuals:
Min 1Q Median 3Q Max
-0.032829 -0.015670 -0.005169 0.008046 0.235669
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0276072 0.0013833 19.957 <2e-16 ***
pers_o -0.0008705 0.0014835 -0.587 0.558
pers_c -0.0016391 0.0015871 -1.033 0.302
pers_e 0.0021386 0.0015724 1.360 0.175
pers_a 0.0024992 0.0015982 1.564 0.119
pers_n 0.0016993 0.0016343 1.040 0.299
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02738 on 386 degrees of freedom
Multiple R-squared: 0.01215, Adjusted R-squared: -0.0006472
F-statistic: 0.9494 on 5 and 386 DF, p-value: 0.4489
# predict slopes from personality with controls
lm_slope_prev_ctrl <- lm(slope_prev ~
pers_o + pers_c + pers_e + pers_a + pers_n +
women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age +
popdens,
data = df_ger_slope_prev)
lm_slope_prev_ctrl %>% summary()
Call:
lm(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a +
pers_n + women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age + popdens,
data = df_ger_slope_prev)
Residuals:
Min 1Q Median 3Q Max
-0.047064 -0.014053 -0.002229 0.008977 0.217515
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0274783 0.0013022 21.101 < 2e-16 ***
pers_o -0.0003747 0.0016078 -0.233 0.8159
pers_c -0.0001953 0.0015584 -0.125 0.9004
pers_e 0.0013162 0.0015344 0.858 0.3915
pers_a 0.0012651 0.0015783 0.802 0.4233
pers_n 0.0008380 0.0015918 0.526 0.5989
women 0.0046402 0.0019204 2.416 0.0162 *
academics 0.0005925 0.0025926 0.229 0.8194
cdu 0.0096133 0.0020618 4.663 4.35e-06 ***
afd 0.0026729 0.0020254 1.320 0.1877
hospital_beds 0.0026756 0.0017517 1.527 0.1275
tourism_beds -0.0023895 0.0014941 -1.599 0.1106
gdp 0.0005674 0.0030072 0.189 0.8504
manufact 0.0028811 0.0024162 1.192 0.2339
airport 0.0033653 0.0016388 2.054 0.0407 *
age -0.0022077 0.0025050 -0.881 0.3787
popdens -0.0003063 0.0022367 -0.137 0.8911
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02575 on 375 degrees of freedom
Multiple R-squared: 0.1509, Adjusted R-squared: 0.1146
F-statistic: 4.164 on 16 and 375 DF, p-value: 2.01e-07
CRF predicting slopes
ctrls <- cforest_unbiased(ntree=500, mtry=5)
crf_slope_prev <- cforest(slope_prev ~
pers_o + pers_c + pers_e + pers_a + pers_n +
women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age +
popdens,
data = df_ger_slope_prev,
controls = ctrls)
crf_slope_prev_varimp <- varimp(crf_slope_prev, nperm = 1)
crf_slope_prev_varimp_cond <- varimp(crf_slope_prev, conditional = T, nperm = 1)
crf_slope_prev_varimp %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

crf_slope_prev_varimp_cond %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

Predict Social Distancing
Change point analysis
# keep only counties with full data
kreis_complete <- df_ger_socdist_scaled %>%
group_by(kreis) %>%
summarize(n = n()) %>%
filter(n==max(.$n)) %>%
.$kreis
# run changepoint analysis
df_ger_socdist_cpt_results <- df_ger_socdist_scaled %>%
select(kreis, socdist_single_tile) %>%
filter(kreis %in% kreis_complete) %>%
split(.$kreis) %>%
map(~ cpt.meanvar(as.vector(.$socdist_single_tile),
#penalty = 'Asymptotic',
class=TRUE,
param.estimates=TRUE,
Q=1,
test.stat = 'Normal'))
# calculate change point
df_ger_socdist_cpt_day <- df_ger_socdist_cpt_results %>%
map(cpts) %>%
unlist() %>%
as.data.frame() %>%
rename(cpt_day_socdist = '.') %>%
rownames_to_column('kreis')
# calculate mean differences
df_ger_socdist_cpt_mean_diff <- df_ger_socdist_cpt_results %>%
map(param.est) %>%
map(~ .$mean) %>%
map(~ .[2]-.[1]) %>%
unlist() %>%
as.data.frame() %>%
rename(mean_diff_socdist = '.') %>%
rownames_to_column('kreis')
# calculate varaince differences
df_ger_socdist_cpt_var_diff <- df_ger_socdist_cpt_results %>%
map(param.est) %>%
map(~ .$variance) %>%
map(~ .[2]-.[1]) %>%
unlist() %>%
as.data.frame() %>%
rename(var_diff_socdist = '.') %>%
rownames_to_column('kreis')
# merge with county data
df_ger_cpt_socdist <- df_ger_socdist_scaled %>%
select(-time, -socdist_single_tile) %>%
distinct() %>%
left_join(df_ger_socdist_cpt_day, by='kreis') %>%
left_join(df_ger_socdist_cpt_mean_diff, by='kreis') %>%
left_join(df_ger_socdist_cpt_var_diff, by='kreis') %>%
left_join(select(df_ger_onset_prev, kreis, onset_prev), by='kreis') %>%
left_join(select(df_ger_slope_prev, kreis, slope_prev), by='kreis')
# handle censored data
df_ger_cpt_socdist <- df_ger_cpt_socdist %>%
mutate(cpt_day_socdist = ifelse(is.na(cpt_day_socdist),
as.numeric(diff(range(df_ger_socdist$date))),
cpt_day_socdist)) %>%
mutate(event = ifelse(cpt_day_socdist >= 60, 0, 1))
df_ger_cpt_socdist$cpt_day_socdist %>% hist()

df_ger_cpt_socdist$mean_diff_socdist %>% hist()

df_ger_cpt_socdist$var_diff_socdist %>% hist()

for(i in head(df_ger_socdist_cpt_results, 5)){
plot(i)
}




NA

Predicting change points with time-to-event regression
# predict hazard from personality
cox_cpt_socdist <- coxph(Surv(cpt_day_socdist, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_ger_cpt_socdist)
cox_cpt_socdist %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c +
pers_e + pers_a + pers_n, data = df_ger_cpt_socdist)
n= 400, number of events= 400
coef exp(coef) se(coef) z Pr(>|z|)
pers_o 0.13238 1.14154 0.05555 2.383 0.0172 *
pers_c -0.04634 0.95472 0.05364 -0.864 0.3876
pers_e -0.08928 0.91459 0.05443 -1.640 0.1009
pers_a -0.05236 0.94898 0.04881 -1.073 0.2833
pers_n -0.08884 0.91499 0.05376 -1.653 0.0984 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 1.1415 0.876 1.0238 1.273
pers_c 0.9547 1.047 0.8594 1.061
pers_e 0.9146 1.093 0.8221 1.018
pers_a 0.9490 1.054 0.8624 1.044
pers_n 0.9150 1.093 0.8235 1.017
Concordance= 0.595 (se = 0.024 )
Likelihood ratio test= 10.81 on 5 df, p=0.06
Wald test = 10.76 on 5 df, p=0.06
Score (logrank) test = 10.71 on 5 df, p=0.06
# predict hazard from personality with controls
cox_cpt_socdist_ctrl <- coxph(Surv(cpt_day_socdist, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n +
women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age +
popdens,
data = df_ger_cpt_socdist,)
cox_cpt_socdist_ctrl %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c +
pers_e + pers_a + pers_n + women + academics + cdu + afd +
hospital_beds + tourism_beds + gdp + manufact + airport +
age + popdens, data = df_ger_cpt_socdist)
n= 392, number of events= 392
(8 observations deleted due to missingness)
coef exp(coef) se(coef) z Pr(>|z|)
pers_o 0.013954 1.014052 0.064817 0.215 0.82954
pers_c -0.035378 0.965241 0.061566 -0.575 0.56554
pers_e -0.157296 0.854451 0.061888 -2.542 0.01103 *
pers_a -0.008478 0.991558 0.057259 -0.148 0.88229
pers_n -0.043137 0.957780 0.060730 -0.710 0.47751
women 0.084290 1.087945 0.076682 1.099 0.27167
academics -0.055918 0.945616 0.109764 -0.509 0.61044
cdu -0.135885 0.872943 0.083444 -1.628 0.10343
afd -0.105132 0.900205 0.090520 -1.161 0.24547
hospital_beds -0.196237 0.821818 0.065813 -2.982 0.00287 **
tourism_beds 0.102105 1.107500 0.057115 1.788 0.07382 .
gdp 0.135235 1.144806 0.126125 1.072 0.28362
manufact -0.125882 0.881719 0.093401 -1.348 0.17774
airport -0.074355 0.928342 0.065237 -1.140 0.25438
age -0.181020 0.834419 0.098405 -1.840 0.06584 .
popdens 0.135757 1.145404 0.087636 1.549 0.12136
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 1.0141 0.9861 0.8931 1.1514
pers_c 0.9652 1.0360 0.8555 1.0890
pers_e 0.8545 1.1703 0.7568 0.9646
pers_a 0.9916 1.0085 0.8863 1.1093
pers_n 0.9578 1.0441 0.8503 1.0788
women 1.0879 0.9192 0.9361 1.2644
academics 0.9456 1.0575 0.7626 1.1726
cdu 0.8729 1.1455 0.7412 1.0280
afd 0.9002 1.1109 0.7539 1.0750
hospital_beds 0.8218 1.2168 0.7224 0.9350
tourism_beds 1.1075 0.9029 0.9902 1.2387
gdp 1.1448 0.8735 0.8941 1.4659
manufact 0.8817 1.1341 0.7342 1.0588
airport 0.9283 1.0772 0.8169 1.0550
age 0.8344 1.1984 0.6881 1.0119
popdens 1.1454 0.8731 0.9646 1.3600
Concordance= 0.703 (se = 0.021 )
Likelihood ratio test= 64.83 on 16 df, p=8e-08
Wald test = 68.61 on 16 df, p=2e-08
Score (logrank) test = 70.59 on 16 df, p=8e-09
# predict hazard from personality with controls
cox_cpt_socdist_ctrl2 <- coxph(Surv(cpt_day_socdist, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n +
women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age +
popdens + onset_prev + slope_prev,
data = df_ger_cpt_socdist)
cox_cpt_socdist_ctrl2 %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c +
pers_e + pers_a + pers_n + women + academics + cdu + afd +
hospital_beds + tourism_beds + gdp + manufact + airport +
age + popdens + onset_prev + slope_prev, data = df_ger_cpt_socdist)
n= 392, number of events= 392
(8 observations deleted due to missingness)
coef exp(coef) se(coef) z Pr(>|z|)
pers_o 0.011438 1.011504 0.065327 0.175 0.86100
pers_c -0.035315 0.965301 0.061681 -0.573 0.56695
pers_e -0.164389 0.848412 0.062459 -2.632 0.00849 **
pers_a -0.001916 0.998086 0.058253 -0.033 0.97377
pers_n -0.026007 0.974329 0.061798 -0.421 0.67388
women 0.095528 1.100239 0.078771 1.213 0.22524
academics -0.083599 0.919800 0.111618 -0.749 0.45388
cdu -0.148737 0.861796 0.087875 -1.693 0.09053 .
afd -0.092155 0.911964 0.091530 -1.007 0.31402
hospital_beds -0.191478 0.825738 0.066089 -2.897 0.00376 **
tourism_beds 0.103020 1.108513 0.057201 1.801 0.07170 .
gdp 0.171296 1.186842 0.127477 1.344 0.17903
manufact -0.151711 0.859237 0.094398 -1.607 0.10802
airport -0.064266 0.937756 0.065954 -0.974 0.32985
age -0.173100 0.841053 0.099696 -1.736 0.08251 .
popdens 0.121096 1.128733 0.087691 1.381 0.16730
onset_prev -0.008623 0.991414 0.005259 -1.640 0.10110
slope_prev 0.259984 1.296909 2.375477 0.109 0.91285
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 1.0115 0.9886 0.88994 1.1497
pers_c 0.9653 1.0359 0.85538 1.0893
pers_e 0.8484 1.1787 0.75066 0.9589
pers_a 0.9981 1.0019 0.89040 1.1188
pers_n 0.9743 1.0263 0.86318 1.0998
women 1.1002 0.9089 0.94284 1.2839
academics 0.9198 1.0872 0.73907 1.1447
cdu 0.8618 1.1604 0.72545 1.0238
afd 0.9120 1.0965 0.76220 1.0912
hospital_beds 0.8257 1.2110 0.72542 0.9399
tourism_beds 1.1085 0.9021 0.99095 1.2400
gdp 1.1868 0.8426 0.92445 1.5237
manufact 0.8592 1.1638 0.71410 1.0339
airport 0.9378 1.0664 0.82404 1.0672
age 0.8411 1.1890 0.69177 1.0226
popdens 1.1287 0.8859 0.95049 1.3404
onset_prev 0.9914 1.0087 0.98125 1.0017
slope_prev 1.2969 0.7711 0.01233 136.4328
Concordance= 0.704 (se = 0.021 )
Likelihood ratio test= 68.07 on 18 df, p=1e-07
Wald test = 71.78 on 18 df, p=2e-08
Score (logrank) test = 73.73 on 18 df, p=1e-08
Linear models predicting mean differences
lm_meandiff_socdist <- lm(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_ger_cpt_socdist)
lm_meandiff_socdist %>% summary()
Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a +
pers_n, data = df_ger_cpt_socdist)
Residuals:
Min 1Q Median 3Q Max
-0.042484 -0.009668 -0.000179 0.008346 0.062165
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0949484 0.0007323 129.654 < 2e-16 ***
pers_o 0.0056844 0.0007839 7.251 2.21e-12 ***
pers_c -0.0008564 0.0008316 -1.030 0.3037
pers_e 0.0008648 0.0008356 1.035 0.3014
pers_a -0.0002079 0.0008311 -0.250 0.8026
pers_n -0.0020169 0.0008627 -2.338 0.0199 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01465 on 394 degrees of freedom
Multiple R-squared: 0.1631, Adjusted R-squared: 0.1525
F-statistic: 15.36 on 5 and 394 DF, p-value: 8.43e-14
lm_meandiff_socdist_ctrl <- lm(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n +
women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age +
popdens,
data = df_ger_cpt_socdist,)
lm_meandiff_socdist_ctrl %>% summary()
Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a +
pers_n + women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age + popdens,
data = df_ger_cpt_socdist)
Residuals:
Min 1Q Median 3Q Max
-0.045968 -0.007500 -0.000700 0.006643 0.039513
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 9.485e-02 5.814e-04 163.137 < 2e-16 ***
pers_o 1.708e-03 7.178e-04 2.379 0.017838 *
pers_c 7.003e-04 6.958e-04 1.007 0.314809
pers_e -8.269e-04 6.850e-04 -1.207 0.228176
pers_a -3.770e-04 7.047e-04 -0.535 0.592923
pers_n -2.724e-05 7.107e-04 -0.038 0.969449
women 2.286e-03 8.574e-04 2.666 0.008013 **
academics 1.987e-03 1.157e-03 1.716 0.086908 .
cdu 2.873e-03 9.205e-04 3.121 0.001942 **
afd -1.348e-03 9.043e-04 -1.490 0.137006
hospital_beds -2.819e-03 7.821e-04 -3.604 0.000355 ***
tourism_beds 4.121e-05 6.670e-04 0.062 0.950768
gdp 5.408e-03 1.343e-03 4.028 6.82e-05 ***
manufact -1.267e-03 1.079e-03 -1.175 0.240741
airport -1.163e-03 7.317e-04 -1.589 0.112832
age -4.297e-03 1.118e-03 -3.842 0.000143 ***
popdens 7.862e-04 9.986e-04 0.787 0.431608
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0115 on 375 degrees of freedom
(8 observations deleted due to missingness)
Multiple R-squared: 0.5001, Adjusted R-squared: 0.4787
F-statistic: 23.44 on 16 and 375 DF, p-value: < 2.2e-16
lm_meandiff_socdist_ctrl2 <- lm(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n +
women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age +
popdens + onset_prev + slope_prev,
data = df_ger_cpt_socdist)
lm_meandiff_socdist_ctrl2 %>% summary()
Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a +
pers_n + women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age + popdens +
onset_prev + slope_prev, data = df_ger_cpt_socdist)
Residuals:
Min 1Q Median 3Q Max
-0.044599 -0.007374 -0.000808 0.006306 0.040989
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 9.476e-02 3.013e-03 31.446 < 2e-16 ***
pers_o 1.742e-03 7.021e-04 2.481 0.013540 *
pers_c 7.559e-04 6.818e-04 1.109 0.268258
pers_e -9.932e-04 6.721e-04 -1.478 0.140321
pers_a -4.823e-04 6.900e-04 -0.699 0.485022
pers_n -2.376e-05 7.018e-04 -0.034 0.973012
women 1.794e-03 8.465e-04 2.119 0.034720 *
academics 1.794e-03 1.142e-03 1.571 0.117084
cdu 1.747e-03 9.532e-04 1.833 0.067665 .
afd -1.604e-03 8.864e-04 -1.809 0.071255 .
hospital_beds -3.013e-03 7.706e-04 -3.910 0.000109 ***
tourism_beds 3.179e-04 6.567e-04 0.484 0.628597
gdp 5.439e-03 1.317e-03 4.131 4.47e-05 ***
manufact -1.618e-03 1.060e-03 -1.526 0.127771
airport -1.478e-03 7.197e-04 -2.054 0.040649 *
age -4.000e-03 1.099e-03 -3.640 0.000312 ***
popdens 7.496e-04 9.795e-04 0.765 0.444575
onset_prev -5.130e-05 5.793e-05 -0.885 0.376476
slope_prev 1.077e-01 2.593e-02 4.152 4.08e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01125 on 373 degrees of freedom
(8 observations deleted due to missingness)
Multiple R-squared: 0.5243, Adjusted R-squared: 0.5014
F-statistic: 22.84 on 18 and 373 DF, p-value: < 2.2e-16
CRF predicting mean difference
ctrls <- cforest_unbiased(ntree=500, mtry=5)
crf_meandiff_socdist <- cforest(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n +
women + academics + cdu + afd + hospital_beds +
tourism_beds + gdp + manufact + airport + age +
popdens + onset_prev + slope_prev,
data = df_ger_cpt_socdist %>% drop_na(),
controls = ctrls)
crf_meandiff_socdist_varimp <- varimp(crf_meandiff_socdist, nperm = 1)
crf_meandiff_socdist_varimp_cond <- varimp(crf_meandiff_socdist, conditional = T, nperm = 1)
crf_meandiff_socdist_varimp %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

crf_meandiff_socdist_varimp_cond %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

Export data
us_list_results <- list(cox_onset_prev, cox_onset_prev_ctrl,
lm_slope_prev, lm_slope_prev_coef,
cox_cpt_socdist, cox_cpt_socdist_ctrl, cox_cpt_socdist_ctrl2,
lm_meandiff_socdist, lm_meandiff_socdist_ctrl, lm_meandiff_socdist_ctrl2)
results_names <- list('cox_onset_prev', 'cox_onset_prev_ctrl',
'lm_slope_prev', 'lm_slope_prev_coef',
'cox_cpt_socdist', 'cox_cpt_socdist_ctrl', 'cox_cpt_socdist_ctrl2',
'lm_meandiff_socdist', 'lm_meandiff_socdist_ctrl', 'lm_meandiff_socdist_ctrl2')
names(us_list_results) <- results_names
save(us_list_results, file="us_list_results.RData")
write_csv(df_us_slope_prev, 'df_us_slope_prev.csv')
write_csv(df_us_cpt_socdist, 'df_us_cpt_socdist.csv')
LS0tCnRpdGxlOiAiQ09WSUQxOSBHRVIiCmF1dGhvcjogIkhlaW5yaWNoIFBldGVycyIKZGF0ZTogIjQvMjMvMjAyMCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCgojIE1BQwoga25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnL1VzZXJzL2hwMjUwMC9Hb29nbGUgRHJpdmUvU1RVRFkvQ29sdW1iaWEvUmVzZWFyY2gvQ29yb25hL0RhdGEvR0VSJykKIApsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGFydHkpCgpgYGAKCiMgUHJlcGFyZSBkYXRhCgojIyMgUHJldmFsZW5jZQpgYGB7cn0KCmRmX2dlcl9wcmV2IDwtIHJlYWRfY3N2KCdHZXJtYW55X3RpbWVzZXJpZXNfcHJlcC5jc3YnKQoKZGZfZ2VyX3ByZXYgPC0gZGZfZ2VyX3ByZXYgJT4lIG11dGF0ZShkYXRlID0gYXMuRGF0ZShkYXRlLCAiJWQlYiVZIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmVpcyA9IGFzLmNoYXJhY3RlcihrcmVpcykpICU+JSAKICBkcGx5cjo6c2VsZWN0KGtyZWlzLCBkYXRlLCByYXRlX2RheSkKCmRmX2dlcl9wcmV2CmBgYAoKIyMjIFNjb2lhbCBkaXN0YW5jaW5nCmBgYHtyfQoKZGZfZ2VyX3NvY2Rpc3QgPC0gcmVhZF9jc3YoJ0dlcm1hbnlfc29jZGlzdF9mYl9rcmVpcy5jc3YnKQoKZGZfZ2VyX3NvY2Rpc3QgPC0gZGZfZ2VyX3NvY2Rpc3QgJT4lIAogIHJlbmFtZShzb2NkaXN0X3NpbmdsZV90aWxlID0gYWxsX2RheV9yYXRpb19zaW5nbGVfdGlsZV91c2VycykgJT4lCiAgc2VsZWN0KGtyZWlzLCBkYXRlLCBzb2NkaXN0X3NpbmdsZV90aWxlKSAlPiUgCiAgbXV0YXRlKGtyZWlzID0gYXMuY2hhcmFjdGVyKGtyZWlzKSkKCmRmX2dlcl9zb2NkaXN0CgpgYGAKCiMjIyBQZXJzb25hbGl0eSAKYGBge3J9CgpkZl9nZXJfcGVycyA8LSByZWFkX2NzdignR2VybWFueV90aW1lc2VyaWVzX3ByZXAuY3N2JykKCmRmX2dlcl9wZXJzIDwtIGRmX2dlcl9wZXJzICU+JSAKICBzZWxlY3Qoa3JlaXMsIG9wZW4sIHNjaSwgZXh0cmEsIGFncmVlLCBuZXVybykgJT4lCiAgZHBseXI6OnJlbmFtZShwZXJzX28gPSBvcGVuLCAKICAgICAgICAgcGVyc19jID0gc2NpLAogICAgICAgICBwZXJzX2UgPSBleHRyYSwKICAgICAgICAgcGVyc19hID0gYWdyZWUsCiAgICAgICAgIHBlcnNfbiA9IG5ldXJvKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShrcmVpcyA9IGFzLmNoYXJhY3RlcihrcmVpcykpCgpkZl9nZXJfcGVycwoKYGBgCgoKIyMjIENvbnRyb2xzIApgYGB7cn0KCmRmX2dlcl9jdHJsIDwtIHJlYWQuY3N2MignR2VybWFueV9jb250cm9scy5jc3YnLCBzZXAgPSAnOycsIGRlYz0nLCcpCgpkZl9nZXJfY3RybCA8LSBkZl9nZXJfY3RybCAlPiUgc2VsZWN0KC1rcmVpc19ubWUpICU+JQogICAgbXV0YXRlKGtyZWlzID0gYXMuY2hhcmFjdGVyKGtyZWlzKSwKICAgICAgICAgICBwb3BkZW5zID0gcG9wZGVucyAlPiUgCiAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIoKSAlPiUKICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXC4nLCAnJyklPiUKICAgICAgICAgICAgIGFzLm51bWVyaWMoKSkKCmRmX2dlcl9jdHJsCgpgYGAKCiMjIyBNZXJnZSBwcmV2YWxlbmNlIGRhdGEgCmBgYHtyfQojIGNyZWF0ZSBzZXF1ZW5jZSBvZiBkYXRlcwpkYXRlX3NlcXVlbmNlIDwtIHNlcS5EYXRlKG1pbihkZl9nZXJfcHJldiRkYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoZGZfZ2VyX3ByZXYkZGF0ZSksIDEpCiAgICAgICAgICAgICAgICAgICAgIAojIGNyZWF0ZSBkYXRhIGZyYW1lIHdpdGggdGltZSBzZXF1ZW5jZQpkZl9kYXRlcyA9IHRpYmJsZShkYXRlX3NlcXVlbmNlLCAxOmxlbmd0aChkYXRlX3NlcXVlbmNlKSkgCm5hbWVzKGRmX2RhdGVzKSA8LSBjKCdkYXRlJywgJ3RpbWUnKQoKCiMgbWVyZ2UgcHJldmFsZW5jZSBkYXRhCmRmX2dlcl9wcmV2IDwtIGRmX2dlcl9wcmV2ICU+JSAKICBpbm5lcl9qb2luKGRmX2dlcl9wZXJzLCBieSA9ICdrcmVpcycpICU+JQogIGlubmVyX2pvaW4oZGZfZ2VyX2N0cmwsIGJ5ID0gJ2tyZWlzJykgJT4lCiAgbWVyZ2UoZGZfZGF0ZXMsIGJ5PSdkYXRlJykgJT4lIAogIGFycmFuZ2Uoa3JlaXMpCgpkZl9nZXJfcHJldgpgYGAKCiMjIyBNZXJnZSBzb2NkaXN0IGRhdGEKYGBge3J9CgojIGNyZWF0ZSBzZXF1ZW5jZSBvZiBkYXRlcwpkYXRlX3NlcXVlbmNlIDwtIHNlcS5EYXRlKG1pbihkZl9nZXJfc29jZGlzdCRkYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoZGZfZ2VyX3NvY2Rpc3QkZGF0ZSksIDEpCiAgICAgICAgICAgICAgICAgICAgIAojIGNyZWF0ZSBkYXRhIGZyYW1lIHdpdGggdGltZSBzZXF1ZW5jZQpkZl9kYXRlcyA9IHRpYmJsZShkYXRlX3NlcXVlbmNlLCAxOmxlbmd0aChkYXRlX3NlcXVlbmNlKSkgCm5hbWVzKGRmX2RhdGVzKSA8LSBjKCdkYXRlJywgJ3RpbWUnKQoKIyBtZXJnZSBzb2NkaXN0IGRhdGEKZGZfZ2VyX3NvY2Rpc3QgPC0gZGZfZ2VyX3NvY2Rpc3QgJT4lIAogIGlubmVyX2pvaW4oZGZfZ2VyX3BlcnMsIGJ5ID0gJ2tyZWlzJykgJT4lCiAgaW5uZXJfam9pbihkZl9nZXJfY3RybCwgYnkgPSAna3JlaXMnKSAlPiUgCiAgbWVyZ2UoZGZfZGF0ZXMsIGJ5PSdkYXRlJykgJT4lIAogIGFycmFuZ2Uoa3JlaXMpCgpkZl9nZXJfc29jZGlzdAoKYGBgCgojIyMgQ29udHJvbCBmb3Igd2Vla2VuZCBlZmZlY3QgCmBgYHtyfQoKZWFzdGVyIDwtIHNlcS5EYXRlKGFzLkRhdGUoJzIwMjAtMDQtMTAnKSwgYXMuRGF0ZSgnMjAyMC0wNC0xMycpLCAxKQoKZGZfZ2VyX2xvZXNzIDwtIGRmX2dlcl9zb2NkaXN0ICU+JSAKICBtdXRhdGUod2Vla2RheSA9IGZvcm1hdChkYXRlLCAnJXUnKSkgJT4lIAogIGZpbHRlcighKHdlZWtkYXkgJWluJSBjKCc2JywnNycpIHwgZGF0ZSAlaW4lIGVhc3RlcikpICU+JSAKICBzcGxpdCguJGtyZWlzKSAlPiUKICBtYXAofiBsb2Vzcyhzb2NkaXN0X3NpbmdsZV90aWxlIH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAocHJlZGljdCwgMTptYXgoZGZfZ2VyX3NvY2Rpc3QkdGltZSkpICU+JSAKICBiaW5kX3Jvd3MoKSAlPiUgCiAgZ2F0aGVyKGtleSA9ICdrcmVpcycsIHZhbHVlID0gJ2xvZXNzJykgJT4lIAogIGdyb3VwX2J5KGtyZWlzKSAlPiUgCiAgbXV0YXRlKHRpbWUgPSByb3dfbnVtYmVyKCkpCgpkZl9nZXJfc29jZGlzdCA8LSBkZl9nZXJfc29jZGlzdCAlPiUgbWVyZ2UoZGZfZ2VyX2xvZXNzLCBieT1jKCdrcmVpcycsICd0aW1lJykpICU+JSAKICBtdXRhdGUod2Vla2RheSA9IGZvcm1hdChkYXRlLCAnJXUnKSkgJT4lIAogIG11dGF0ZShzb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuID0gaWZlbHNlKHdlZWtkYXkgJWluJSBjKCc2JywnNycpIHwgZGF0ZSAlaW4lIGVhc3RlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9lc3MsIHNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSAlPiUKICBhcnJhbmdlKGtyZWlzLCB0aW1lKSAlPiUgCiAgc2VsZWN0KC13ZWVrZGF5KQoKZGZfZ2VyX3NvY2Rpc3QgJT4lIGRyb3BfbmEoKQoKYGBgCgoKIyBFeHBsb3JlIGRhdGEKCiMjIyBQbG90IHByZXZhbGVuY2Ugb3ZlciB0aW1lCmBgYHtyfQoKZGZfZ2VyX3ByZXYgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXJhdGVfZGF5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9a3JlaXMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoIk92ZXJhbGwgcHJldmFsZW5jZSBvdmVyIHRpbWUiKQoKcGVycyA8LSBjKCdwZXJzX28nLCAncGVyc19jJywgJ3BlcnNfZScsICdwZXJzX2EnLCAncGVyc19uJykKCmZvciAoaSBpbiBwZXJzKXsKCmdnIDwtIGRmX2dlcl9wcmV2ICU+JSBtdXRhdGUocHJldl90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjIpLCBxdWFudGlsZSguW1tpXV0sIDAuOCksIEluZiksCiAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIocHJldl90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yYXRlX2RheSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWtyZWlzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIGZhY2V0X3dyYXAofnByZXZfdGFpbCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZShpKQoKcHJpbnQoZ2cpCn0KCmBgYAoKCiMjIyBQbG90IHNvY2lhbCBkaXN0YW5jaW5nIChzaW5nbGUgdGlsZSkgb3ZlciB0aW1lCgpgYGB7cn0KCmRmX2dlcl9zb2NkaXN0ICU+JSBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9a3JlaXMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoIk92ZXJhbGwgc29jaWFsIGRpc3RhbmNpbmcgKHNpbmdsZSB0aWxlKSBvdmVyIHRpbWUiKQoKcGVycyA8LSBjKCdwZXJzX28nLCAncGVyc19jJywgJ3BlcnNfZScsICdwZXJzX2EnLCAncGVyc19uJykKCmZvciAoaSBpbiBwZXJzKXsKCmdnIDwtIGRmX2dlcl9zb2NkaXN0ICU+JSBtdXRhdGUocHJldl90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjIpLCBxdWFudGlsZSguW1tpXV0sIDAuOCksIEluZiksCiAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIocHJldl90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9a3JlaXMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgZmFjZXRfd3JhcCh+cHJldl90YWlsKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQoKYGBgCgoKYGBge3J9CgpkZl9nZXJfc29jZGlzdCA8LSBkZl9nZXJfc29jZGlzdCAlPiUgbXV0YXRlKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgPSBzb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuKSAlPiUgCiAgc2VsZWN0KC1sb2VzcywgLXNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4pCgpgYGAKCgojIyMgQ29ycmVsYXRpb25zCmBgYHtyfQoKZGZfZ2VyX3ByZXYgJT4lIGdyb3VwX2J5KGtyZWlzKSAlPiUgCiAgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsIG1lYW4pICU+JSAKICBzZWxlY3QoLWtyZWlzLCAtdGltZSkgJT4lIAogIGNvcih1c2U9J3BhaXJ3aXNlLmNvbXBsZXRlJykgJT4lIAogIHJvdW5kKDMpICU+JSBhcy5kYXRhLmZyYW1lKCkKCmRmX2dlcl9zb2NkaXN0ICU+JSBncm91cF9ieShrcmVpcykgJT4lIAogIHN1bW1hcml6ZV9pZihpcy5udW1lcmljLCBtZWFuKSAlPiUgCiAgc2VsZWN0KC1rcmVpcywgLXRpbWUpICU+JSAKICBjb3IodXNlPSdwYWlyd2lzZS5jb21wbGV0ZScpICU+JSAKICByb3VuZCgzKSAlPiUgYXMuZGF0YS5mcmFtZSgpCiAKIApgYGAKCiMjIFJlc2NhbGUgZGF0YQpgYGB7cn0KCmx2bDJfc2NhbGVkIDwtIGRmX2dlcl9wcmV2ICU+JSAKICBkcGx5cjo6c2VsZWN0KC10aW1lLCAtcmF0ZV9kYXksIC1kYXRlKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoLWtyZWlzKSwgc2NhbGUpCiAgCmx2bDFfc2NhbGVkIDwtIGRmX2dlcl9wcmV2ICU+JSBzZWxlY3Qoa3JlaXMsIHRpbWUsIHJhdGVfZGF5KQoKZGZfZ2VyX3ByZXZfc2NhbGVkIDwtIHBseXI6OmpvaW4obHZsMV9zY2FsZWQsIGx2bDJfc2NhbGVkLCBieSA9ICdrcmVpcycpCgpkZl9nZXJfcHJldl9zY2FsZWQKCmBgYAoKYGBge3J9CgpsdmwyX3NjYWxlZCA8LSBkZl9nZXJfc29jZGlzdCAlPiUgCiAgZHBseXI6OnNlbGVjdCgtdGltZSwgLXNvY2Rpc3Rfc2luZ2xlX3RpbGUsIC1kYXRlKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoLWtyZWlzKSwgc2NhbGUpCiAgCmx2bDFfc2NhbGVkIDwtIGRmX2dlcl9zb2NkaXN0ICU+JSBzZWxlY3Qoa3JlaXMsIHRpbWUsIHNvY2Rpc3Rfc2luZ2xlX3RpbGUpCgpkZl9nZXJfc29jZGlzdF9zY2FsZWQgPC0gcGx5cjo6am9pbihsdmwxX3NjYWxlZCwgbHZsMl9zY2FsZWQsIGJ5ID0gJ2tyZWlzJykKCmRmX2dlcl9zb2NkaXN0X3NjYWxlZAoKYGBgCgojIFByZWRpY3QgUHJldmFsZW5jZQojIyMgRXh0cmFjdCBmaXJzdCBkYXkgb2YgY292aWQgb3V0YnJlYWsKYGBge3J9CgojIGdldCBvbnNldCBkYXkKZGZfZ2VyX29uc2V0X3ByZXYgPC0gZGZfZ2VyX3ByZXZfc2NhbGVkICU+JSAKICBncm91cF9ieShrcmVpcykgJT4lIAogIG11dGF0ZShyYXRlX2NzID0gY3Vtc3VtKHJhdGVfZGF5KSkgJT4lIAogIGZpbHRlcihyYXRlX2NzID4gMCkgJT4lCiAgc3VtbWFyaXplKG9uc2V0X3ByZXYgPSBtaW4odGltZSkpCiAgCiMgbWVyZ2Ugd2l0aCBjb3VudHkgZGF0YQpkZl9nZXJfb25zZXRfcHJldiA8LSBkZl9nZXJfcHJldl9zY2FsZWQgJT4lIAogIHNlbGVjdCgtdGltZSwgLXJhdGVfZGF5KSAlPiUKICBkaXN0aW5jdCgpICU+JSAKICBsZWZ0X2pvaW4oZGZfZ2VyX29uc2V0X3ByZXYsIGJ5ID0gJ2tyZWlzJykKCiMgaGFuZGxlIGNlbnNvcmVkIGRhdGEKZGZfZ2VyX29uc2V0X3ByZXYgPC0gZGZfZ2VyX29uc2V0X3ByZXYgJT4lIAogIG11dGF0ZShldmVudCA9IGlmZWxzZShpcy5uYShvbnNldF9wcmV2KSwgMCwgMSkpICU+JSAKICBtdXRhdGUob25zZXRfcHJldiA9IHJlcGxhY2VfbmEob25zZXRfcHJldiwgYXMubnVtZXJpYyhkaWZmKHJhbmdlKGRmX2dlcl9wcmV2JGRhdGUpKSkrMSkpCgpkZl9nZXJfb25zZXRfcHJldgoKYGBgCgojIyMgRXh0cmFjdCBzbG9wZXMKYGBge3J9CgojIGN1dCB0aW1lIHNlcmllcyBiZWZvcmUgb25zZXQKZGZfZ2VyX3ByZXZfc2NhbGVkIDwtIGRmX2dlcl9wcmV2X3NjYWxlZCAlPiUgCiAgZ3JvdXBfYnkoa3JlaXMpICU+JSAKICBtdXRhdGUocmF0ZV9jcyA9IGN1bXN1bShyYXRlX2RheSkpICU+JSAKICBmaWx0ZXIocmF0ZV9jcyA+IDApICU+JQogIG11dGF0ZSh0aW1lID0gdGltZS1taW4odGltZSkrMSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcih0aW1lIDw9IDMwKSAlPiUKICBzZWxlY3QoLXJhdGVfY3MpCgojIGRyb3AgY291bnRpZXMgd2l0aCBsaXR0bGUgZGF0YQpkZl9nZXJfcHJldl9zY2FsZWQgPC0gZGZfZ2VyX3ByZXZfc2NhbGVkICU+JQogIGdyb3VwX2J5KGtyZWlzKSAlPiUKICBmaWx0ZXIobigpID09IDMwKSAlPiUKICB1bmdyb3VwKCkKCiMgZXh0cmFjdCBzbG9wZSBwcmV2YWxlbmNlCmRmX2dlcl9zbG9wZV9wcmV2IDwtIGRmX2dlcl9wcmV2X3NjYWxlZCAlPiUgCiAgc3BsaXQoLiRrcmVpcykgJT4lIAogIG1hcCh+IGxtKHJhdGVfZGF5IH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAoY29lZikgJT4lIAogIG1hcF9kYmwoJ3RpbWUnKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ2tyZWlzJykgJT4lIAogIHJlbmFtZShzbG9wZV9wcmV2ID0gJy4nKQoKIyBtZXJnZSB3aXRoIGNvdW50eSBkYXRhCmRmX2dlcl9zbG9wZV9wcmV2IDwtIGRmX2dlcl9wcmV2X3NjYWxlZCAlPiUgCiAgc2VsZWN0KC10aW1lLCAtcmF0ZV9kYXkpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGlubmVyX2pvaW4oZGZfZ2VyX3Nsb3BlX3ByZXYsIGJ5ID0gJ2tyZWlzJykgJT4lCiAgZHJvcF9uYSgpCgojIHN0YW5kYXJkaXplIHNsb3BlcwpkZl9nZXJfc2xvcGVfcHJldiA8LSBkZl9nZXJfc2xvcGVfcHJldiAlPiUgCiAgbXV0YXRlKHNsb3BlX3ByZXYgPSBzY2FsZShzbG9wZV9wcmV2KSkKCmBgYAoKCiMjIyBFeHBsb3JlIGRpc3RyaWJ1dGlvbnMKYGBge3J9CgpkZl9nZXJfb25zZXRfcHJldiAlPiUgZ2dwbG90KGFlcyhvbnNldF9wcmV2KSkgKyBnZW9tX2hpc3RvZ3JhbSgpCmRmX2dlcl9zbG9wZV9wcmV2ICU+JSBnZ3Bsb3QoYWVzKHNsb3BlX3ByZXYpKSArIGdlb21faGlzdG9ncmFtKCkKCmBgYAoKCiMjIFByZWRpY3QgQ09WSUQgb25zZXQgd2l0aCB0aW1lLXRvLWV2ZW50IHJlZ3Jlc3Npb24gCmBgYHtyfQoKIyBwcmVkaWN0IG9uc2V0IGZyb20gcGVyc29uYWxpdHkKY294X29uc2V0X3ByZXYgPC0gY294cGgoU3VydihvbnNldF9wcmV2LCBldmVudCkgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24sIAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX29uc2V0X3ByZXYpCmNveF9vbnNldF9wcmV2ICU+JSBzdW1tYXJ5KCkKCiMgcHJlZGljdCBvbnNldCBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKY294X29uc2V0X3ByZXZfY3RybCA8LSBjb3hwaChTdXJ2KG9uc2V0X3ByZXYsIGV2ZW50KSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbWVuICsgYWNhZGVtaWNzICsgYWZkICsgaG9zcGl0YWxfYmVkcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VyaXNtX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArIGFpcnBvcnQgKyBhZ2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wZGVucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX29uc2V0X3ByZXYpCmNveF9vbnNldF9wcmV2X2N0cmwgJT4lIHN1bW1hcnkoKQoKYGBgCgojIyBQcmVkaWN0IHByZXZhbGVuY2Ugc2xvcGVzIHdpdGggbGluZWFyIG1vZGVscwpgYGB7cn0KCiMgcHJlZGljdCBzbG9wZXMgZnJvbSBwZXJzb25hbGl0eQpsbV9zbG9wZV9wcmV2IDwtIGxtKHNsb3BlX3ByZXYgfiBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24sIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zbG9wZV9wcmV2KQpsbV9zbG9wZV9wcmV2ICU+JSBzdW1tYXJ5KCkKbG1fc2xvcGVfcHJldiAlPiUgY29uZmludChsZXZlbD0wLjkpCgojIHByZWRpY3Qgc2xvcGVzIGZyb20gcGVyc29uYWxpdHkgd2l0aCBjb250cm9scwpsbV9zbG9wZV9wcmV2X2N0cmwgPC0gbG0oc2xvcGVfcHJldiB+ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b21lbiArIGFjYWRlbWljcyArIGFmZCArIGhvc3BpdGFsX2JlZHMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91cmlzbV9iZWRzICsgZ2RwICsgbWFudWZhY3QgKyBhaXJwb3J0ICsgYWdlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3Nsb3BlX3ByZXYpCmxtX3Nsb3BlX3ByZXZfY3RybCAlPiUgc3VtbWFyeSgpCmxtX3Nsb3BlX3ByZXZfY3RybCAlPiUgY29uZmludChsZXZlbD0wLjkpCgpgYGAKCiMjIyBDUkYgcHJlZGljdGluZyBzbG9wZXMKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX3Nsb3BlX3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbWVuICsgYWNhZGVtaWNzICsgYWZkICsgaG9zcGl0YWxfYmVkcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VyaXNtX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArIGFpcnBvcnQgKyBhZ2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wZGVucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zbG9wZV9wcmV2LCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfc2xvcGVfcHJldl92YXJpbXAgPC0gdmFyaW1wKGNyZl9zbG9wZV9wcmV2LCBucGVybSA9IDEpCmNyZl9zbG9wZV9wcmV2X3ZhcmltcF9jb25kIDwtIHZhcmltcChjcmZfc2xvcGVfcHJldiwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfc2xvcGVfcHJldl92YXJpbXAKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9zbG9wZV9wcmV2X3ZhcmltcF9jb25kCmNyZl9zbG9wZV9wcmV2X3ZhcmltcF9jb25kICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIyBQcmVkaWN0IFNvY2lhbCBEaXN0YW5jaW5nCiMjIyBDaGFuZ2UgcG9pbnQgYW5hbHlzaXMKYGBge3J9CgojIGtlZXAgb25seSBjb3VudGllcyB3aXRoIGZ1bGwgZGF0YQprcmVpc19jb21wbGV0ZSA8LSBkZl9nZXJfc29jZGlzdF9zY2FsZWQgJT4lIAogIGdyb3VwX2J5KGtyZWlzKSAlPiUgCiAgc3VtbWFyaXplKG4gPSBuKCkpICU+JSAKICBmaWx0ZXIobj09bWF4KC4kbikpICU+JSAKICAuJGtyZWlzCgojIHJ1biBjaGFuZ2Vwb2ludCBhbmFseXNpcwpkZl9nZXJfc29jZGlzdF9jcHRfcmVzdWx0cyA8LSBkZl9nZXJfc29jZGlzdF9zY2FsZWQgJT4lIAogIHNlbGVjdChrcmVpcywgc29jZGlzdF9zaW5nbGVfdGlsZSkgJT4lCiAgZmlsdGVyKGtyZWlzICVpbiUga3JlaXNfY29tcGxldGUpICU+JSAKICBzcGxpdCguJGtyZWlzKSAlPiUKICBtYXAofiBjcHQubWVhbnZhcihhcy52ZWN0b3IoLiRzb2NkaXN0X3NpbmdsZV90aWxlKSwKICAgICAgICAgICAgICAgICAgICAjcGVuYWx0eSA9ICdBc3ltcHRvdGljJywKICAgICAgICAgICAgICAgICAgICBjbGFzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgIHBhcmFtLmVzdGltYXRlcz1UUlVFLAogICAgICAgICAgICAgICAgICAgIFE9MSwKICAgICAgICAgICAgICAgICAgICB0ZXN0LnN0YXQgPSAnTm9ybWFsJykpCgojIGNhbGN1bGF0ZSBjaGFuZ2UgcG9pbnQKZGZfZ2VyX3NvY2Rpc3RfY3B0X2RheSA8LSBkZl9nZXJfc29jZGlzdF9jcHRfcmVzdWx0cyAlPiUgCiAgbWFwKGNwdHMpICU+JSAKICB1bmxpc3QoKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByZW5hbWUoY3B0X2RheV9zb2NkaXN0ID0gJy4nKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oJ2tyZWlzJykKCiMgY2FsY3VsYXRlIG1lYW4gZGlmZmVyZW5jZXMKZGZfZ2VyX3NvY2Rpc3RfY3B0X21lYW5fZGlmZiA8LSBkZl9nZXJfc29jZGlzdF9jcHRfcmVzdWx0cyAlPiUgCiAgbWFwKHBhcmFtLmVzdCkgJT4lIAogIG1hcCh+IC4kbWVhbikgJT4lIAogIG1hcCh+IC5bMl0tLlsxXSkgJT4lIAogIHVubGlzdCgpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJlbmFtZShtZWFuX2RpZmZfc29jZGlzdCA9ICcuJykgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCdrcmVpcycpCgojIGNhbGN1bGF0ZSB2YXJhaW5jZSBkaWZmZXJlbmNlcwpkZl9nZXJfc29jZGlzdF9jcHRfdmFyX2RpZmYgPC0gZGZfZ2VyX3NvY2Rpc3RfY3B0X3Jlc3VsdHMgJT4lIAogIG1hcChwYXJhbS5lc3QpICU+JSAKICBtYXAofiAuJHZhcmlhbmNlKSAlPiUgCiAgbWFwKH4gLlsyXS0uWzFdKSAlPiUgCiAgdW5saXN0KCkgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcmVuYW1lKHZhcl9kaWZmX3NvY2Rpc3QgPSAnLicpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigna3JlaXMnKQoKIyBtZXJnZSB3aXRoIGNvdW50eSBkYXRhCmRmX2dlcl9jcHRfc29jZGlzdCA8LSBkZl9nZXJfc29jZGlzdF9zY2FsZWQgJT4lIAogIHNlbGVjdCgtdGltZSwgLXNvY2Rpc3Rfc2luZ2xlX3RpbGUpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGxlZnRfam9pbihkZl9nZXJfc29jZGlzdF9jcHRfZGF5LCBieT0na3JlaXMnKSAlPiUKICBsZWZ0X2pvaW4oZGZfZ2VyX3NvY2Rpc3RfY3B0X21lYW5fZGlmZiwgYnk9J2tyZWlzJykgJT4lCiAgbGVmdF9qb2luKGRmX2dlcl9zb2NkaXN0X2NwdF92YXJfZGlmZiwgYnk9J2tyZWlzJykgJT4lCiAgbGVmdF9qb2luKHNlbGVjdChkZl9nZXJfb25zZXRfcHJldiwga3JlaXMsIG9uc2V0X3ByZXYpLCBieT0na3JlaXMnKSAlPiUKICBsZWZ0X2pvaW4oc2VsZWN0KGRmX2dlcl9zbG9wZV9wcmV2LCBrcmVpcywgc2xvcGVfcHJldiksIGJ5PSdrcmVpcycpIAoKIyBzdGFuZGFyZGl6ZSBtZWFuL3ZhciBkaWZmZXJlbmNlcwpkZl9nZXJfY3B0X3NvY2Rpc3QgPC0gZGZfZ2VyX2NwdF9zb2NkaXN0ICU+JSAKICBtdXRhdGUobWVhbl9kaWZmX3NvY2Rpc3QgPSBzY2FsZShtZWFuX2RpZmZfc29jZGlzdCksCiAgICAgICAgIHZhcl9kaWZmX3NvY2Rpc3QgPSBzY2FsZSh2YXJfZGlmZl9zb2NkaXN0KSkKCiMgaGFuZGxlIGNlbnNvcmVkIGRhdGEKZGZfZ2VyX2NwdF9zb2NkaXN0IDwtIGRmX2dlcl9jcHRfc29jZGlzdCAlPiUgCiAgbXV0YXRlKGNwdF9kYXlfc29jZGlzdCA9IGlmZWxzZShpcy5uYShjcHRfZGF5X3NvY2Rpc3QpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLm51bWVyaWMoZGlmZihyYW5nZShkZl9nZXJfc29jZGlzdCRkYXRlKSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdF9kYXlfc29jZGlzdCkpICU+JSAKICBtdXRhdGUoZXZlbnQgPSBpZmVsc2UoY3B0X2RheV9zb2NkaXN0ID49IDYwLCAwLCAxKSkKCmBgYAoKYGBge3J9CmRmX2dlcl9jcHRfc29jZGlzdCRjcHRfZGF5X3NvY2Rpc3QgJT4lIGhpc3QoKQpkZl9nZXJfY3B0X3NvY2Rpc3QkbWVhbl9kaWZmX3NvY2Rpc3QgJT4lIGhpc3QoKQpkZl9nZXJfY3B0X3NvY2Rpc3QkdmFyX2RpZmZfc29jZGlzdCAlPiUgaGlzdCgpCgpgYGAKCmBgYHtyfQoKZm9yKGkgaW4gaGVhZChkZl9nZXJfc29jZGlzdF9jcHRfcmVzdWx0cywgNSkpewogIHBsb3QoaSkKfQoKYGBgCgoKIyBQcmVkaWN0aW5nIGNoYW5nZSBwb2ludHMgd2l0aCB0aW1lLXRvLWV2ZW50IHJlZ3Jlc3Npb24gCmBgYHtyfQoKIyBwcmVkaWN0IGhhemFyZCBmcm9tIHBlcnNvbmFsaXR5CmNveF9jcHRfc29jZGlzdCA8LSBjb3hwaChTdXJ2KGNwdF9kYXlfc29jZGlzdCwgZXZlbnQpIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiwgCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfY3B0X3NvY2Rpc3QpCmNveF9jcHRfc29jZGlzdCAlPiUgc3VtbWFyeSgpCgojIHByZWRpY3QgaGF6YXJkIGZyb20gcGVyc29uYWxpdHkgd2l0aCBjb250cm9scwpjb3hfY3B0X3NvY2Rpc3RfY3RybCA8LSBjb3hwaChTdXJ2KGNwdF9kYXlfc29jZGlzdCwgZXZlbnQpIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbWVuICsgYWNhZGVtaWNzICsgYWZkICsgaG9zcGl0YWxfYmVkcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VyaXNtX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArIGFpcnBvcnQgKyBhZ2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wZGVucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9jcHRfc29jZGlzdCwpCmNveF9jcHRfc29jZGlzdF9jdHJsICU+JSBzdW1tYXJ5KCkKCiMgcHJlZGljdCBoYXphcmQgZnJvbSBwZXJzb25hbGl0eSB3aXRoIGNvbnRyb2xzCmNveF9jcHRfc29jZGlzdF9jdHJsMiA8LSBjb3hwaChTdXJ2KGNwdF9kYXlfc29jZGlzdCwgZXZlbnQpIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b21lbiArIGFjYWRlbWljcyArIGFmZCArIGhvc3BpdGFsX2JlZHMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91cmlzbV9iZWRzICsgZ2RwICsgbWFudWZhY3QgKyBhaXJwb3J0ICsgYWdlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBvbnNldF9wcmV2ICsgc2xvcGVfcHJldiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9jcHRfc29jZGlzdCkKY294X2NwdF9zb2NkaXN0X2N0cmwyICU+JSBzdW1tYXJ5KCkKCmBgYAoKIyMjIExpbmVhciBtb2RlbHMgcHJlZGljdGluZyBtZWFuIGRpZmZlcmVuY2VzCmBgYHtyfQoKbG1fbWVhbmRpZmZfc29jZGlzdCA8LSBsbShtZWFuX2RpZmZfc29jZGlzdCB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfY3B0X3NvY2Rpc3QpCmxtX21lYW5kaWZmX3NvY2Rpc3QgJT4lIHN1bW1hcnkoKQpsbV9tZWFuZGlmZl9zb2NkaXN0ICU+JSBjb25maW50KGxldmVsPTAuOSkKCmxtX21lYW5kaWZmX3NvY2Rpc3RfY3RybCA8LSBsbShtZWFuX2RpZmZfc29jZGlzdCB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29tZW4gKyBhY2FkZW1pY3MgKyBhZmQgKyBob3NwaXRhbF9iZWRzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdXJpc21fYmVkcyArIGdkcCArIG1hbnVmYWN0ICsgYWlycG9ydCArIGFnZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BkZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX2NwdF9zb2NkaXN0LCkKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsICU+JSBzdW1tYXJ5KCkKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsICU+JSBjb25maW50KGxldmVsPTAuOSkKCmxtX21lYW5kaWZmX3NvY2Rpc3RfY3RybDIgPC0gbG0obWVhbl9kaWZmX3NvY2Rpc3QgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b21lbiArIGFjYWRlbWljcyArIGFmZCArIGhvc3BpdGFsX2JlZHMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91cmlzbV9iZWRzICsgZ2RwICsgbWFudWZhY3QgKyBhaXJwb3J0ICsgYWdlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBvbnNldF9wcmV2ICsgc2xvcGVfcHJldiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9jcHRfc29jZGlzdCkKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsMiAlPiUgc3VtbWFyeSgpCmxtX21lYW5kaWZmX3NvY2Rpc3RfY3RybDIgJT4lIGNvbmZpbnQobGV2ZWw9MC45KQoKYGBgCgojIyMgQ1JGIHByZWRpY3RpbmcgbWVhbiBkaWZmZXJlbmNlCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9tZWFuZGlmZl9zb2NkaXN0IDwtIGNmb3Jlc3QobWVhbl9kaWZmX3NvY2Rpc3QgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b21lbiArIGFjYWRlbWljcyArIGFmZCArIGhvc3BpdGFsX2JlZHMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91cmlzbV9iZWRzICsgZ2RwICsgbWFudWZhY3QgKyBhaXJwb3J0ICsgYWdlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBvbnNldF9wcmV2ICsgc2xvcGVfcHJldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9jcHRfc29jZGlzdCAlPiUgZHJvcF9uYSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcCA8LSB2YXJpbXAoY3JmX21lYW5kaWZmX3NvY2Rpc3QsIG5wZXJtID0gMSkKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wX2NvbmQgPC0gdmFyaW1wKGNyZl9tZWFuZGlmZl9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcApjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXAgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZApjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKIyMjIEV4cG9ydCBkYXRhIApgYGB7cn0KdXNfbGlzdF9yZXN1bHRzIDwtIGxpc3QoY294X29uc2V0X3ByZXYsIGNveF9vbnNldF9wcmV2X2N0cmwsIAogICAgIGxtX3Nsb3BlX3ByZXYsIGxtX3Nsb3BlX3ByZXZfY29lZiwgCiAgICAgY294X2NwdF9zb2NkaXN0LCBjb3hfY3B0X3NvY2Rpc3RfY3RybCwgY294X2NwdF9zb2NkaXN0X2N0cmwyLAogICAgIGxtX21lYW5kaWZmX3NvY2Rpc3QsIGxtX21lYW5kaWZmX3NvY2Rpc3RfY3RybCwgbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsMikKCnJlc3VsdHNfbmFtZXMgPC0gbGlzdCgnY294X29uc2V0X3ByZXYnLCAnY294X29uc2V0X3ByZXZfY3RybCcsIAogICAgICdsbV9zbG9wZV9wcmV2JywgJ2xtX3Nsb3BlX3ByZXZfY29lZicsIAogICAgICdjb3hfY3B0X3NvY2Rpc3QnLCAnY294X2NwdF9zb2NkaXN0X2N0cmwnLCAnY294X2NwdF9zb2NkaXN0X2N0cmwyJywKICAgICAnbG1fbWVhbmRpZmZfc29jZGlzdCcsICdsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmwnLCAnbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsMicpCgpuYW1lcyh1c19saXN0X3Jlc3VsdHMpIDwtIHJlc3VsdHNfbmFtZXMKCnNhdmUodXNfbGlzdF9yZXN1bHRzLCBmaWxlPSJ1c19saXN0X3Jlc3VsdHMuUkRhdGEiKQoKYGBgCgpgYGB7cn0Kd3JpdGVfY3N2KGRmX3VzX3Nsb3BlX3ByZXYsICdkZl91c19zbG9wZV9wcmV2LmNzdicpCndyaXRlX2NzdihkZl91c19jcHRfc29jZGlzdCwgJ2RmX3VzX2NwdF9zb2NkaXN0LmNzdicpCgpgYGA=